/*
因为要求区间数最少的，所以对于每个子区间，我们都要让其尽量长

对此，我们如果每次都让区间的长度增加1，效率就太低了

所以，可以使用倍增的方法，每次将区间扩展一段，从而提高效率

时间复杂度为 O(nlog2n)

具体算法代码如下

*/


//链接：https://www.acwing.com/problem/content/111/

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 500010;

typedef long long LL;

int n,m,t;
//w[]：用于保存原数组
//temp[]：用于保存每次排序后的数组
int w[N],temp[N];

//res表示答案
int res = 0;

LL sq(LL x){
    return x * x;
}

LL get(int l,int r){
    int k = 0;
    //先复制要排序的区间
    for (int i = l; i < r; i++){
        temp[k++] = w[i];
    }
    sort(temp,temp + k);
    LL sum = 0;
    for (int i = 0; i < m && i < k; i++,k--){
        sum += sq(temp[i] - temp[k - 1]);
    }
    return sum;
}

int main(){
    int K;
    scanf("%d",&K);
    while (K--){
        scanf("%d%d%lld",&n,&m,&t);
        for(int i = 0; i < n; i++){
            scanf("%lld",&w[i]);
        }
        res = 0;
        int start = 0,end = 0;
        //确保不越界
        while (end < n){
            //用于记录当前子数组的长度
            int len = 1;
            //下面是倍增过程
            //当子数组长度为0时，说明已经找到一个最长的合法区间
            while (len){
                if (end + len <= n && get(start,end + len) <= t){
                    //如果当前区间的校验值还小于等于t，说明区间还可能继续增大
                    end += len;
                    len <<= 1;
                }else {
                    //如果已经超出了t,则让len缩短一半
                    len >>= 1;
                }
            }
            start = end;
            //只要end还没到最后一个元素，说明区间还有可取的
            //而每次倍增查找，都会找到一个最长的合法区间，所以要让res++
            res++;
        }

        printf("%d\n",res);
    }

    return 0;
}